//
//  MXSUserAccountVM.swift
//  weibo
//
//  Created by 孙飞 on 15/12/9.
//  Copyright © 2015年 Sunfei. All rights reserved.
//

import UIKit

class MXSUserAccountVM {
    
    var userAccount: MXSUserAccount?
    
    // 归档与解档的路径
    var archivePath: String = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("useraccount.archive")
    
    // 是否登录
    var userLogon: Bool {
        return accessToken != nil
    }
    
    
    // ****************** 复制代码：判断token是否过期
    // 只读取属性
    // 返回当前用户的accessToken
    var accessToken: String? {
        
        // 从 userAccount 如果取出 accessToken，还有得判断是否过期
        // 如果没有 return nil
        if let accessToken = userAccount?.access_token where !isExpires {
            // 判断是否过期
            return accessToken
        }
        return nil
    }
    
    // 返回 true 代表过期, false 没有过期
    // 写 getOnly 的原因是代表,我们判断的 accessToken 是否过期是根据当前时间变化计算出来的
    var isExpires: Bool {
        
        guard let expiresDate = userAccount?.expiresDate else {
            return true
        }
        
        // 通过过期时间计算出比过期时间少1的时间
        //        let newDate = expiresDate.dateByAddingTimeInterval(0)
        
        // 当前时间与 expiresDate 进行对比
        // 如果当前时间 不大于 expiresDate 过期时间,是代表不过期:false
        if NSDate().compare(expiresDate) == NSComparisonResult.OrderedAscending {
            return false
        }
        return true
    }
    
    // 全局访问点
    static let sharedAccount: MXSUserAccountVM = MXSUserAccountVM()
    
    private init(){
        // 解档
        userAccount = loadUserAccount()
    }
}


// MARK: - OAuth 登录请求
extension MXSUserAccountVM {
    
    // MARK: - 获取 AccessToken 以及 获取用户的数据
    
    func loadAccessToken(code: String, complete:(isSuccessed: Bool)->()){
        
        MXSNetworkTools.shareTools.loadAccessToken(code) { (response, error) -> () in
            if error != nil {
                print("请求错误:\(error)")
                complete(isSuccessed: false)
                return
            }
            
            // 在强转`!` 与 `?` 的时候,只要看前面的数据是否是一个可选值
            guard let dict = response as? [String: AnyObject] else {
                print("返回数据不是字典")
                return
            }
            let account = MXSUserAccount(dict: dict)
            
            self.userAccount = account
            
            self.loadUserInfo(account.uid!, accessToken: account.access_token!, complete: complete)
        }
        
    }
    
    /// 请求用户的数据
    ///
    private func loadUserInfo(uid: String, accessToken: String, complete:(isSuccessed: Bool)->()){
        
        MXSNetworkTools.shareTools.loadUserInfo(uid, accessToken: accessToken) { (response, error) -> () in
            if error != nil {
                print("请求失败\(error)")
                complete(isSuccessed: false)
                return
            }
            print(response)
            
            // 在 if let 或者 guard let 里面 使用 as 都使用 ?
            guard let responseDic = response as? [String: AnyObject] else {
                print("返回数据不是一个字典")
                return
            }
            
            // 头像/昵称
            self.userAccount?.screen_name = responseDic["screen_name"] as? String
            self.userAccount?.avatar_large = responseDic["avatar_large"] as? String
            
            // 保存
            self.saveAccount(self.userAccount!)
            complete(isSuccessed: true)
        }
        
    }
    
}

// MARK: - 归档与解档当前对象
extension MXSUserAccountVM {
    // 归档当前对象
    func saveAccount(account: MXSUserAccount) {
//        print(archivePath)
        // 2. 归档
        NSKeyedArchiver.archiveRootObject(account, toFile: archivePath)
    }
    
    // 解档
    func loadUserAccount() -> MXSUserAccount? {
        // 1. 获取路径
        // 2. 解档
        let result = NSKeyedUnarchiver.unarchiveObjectWithFile(archivePath) as? MXSUserAccount
        return result
    }
}